﻿#include "newconrect.h"
#include "Sington.h"
#include <QDebug>
#include <QHostInfo>
#include "tcpmanager.h"

NewConRect::NewConRect()
{
    connect(TcpManager::instance(),&TcpManager::connectToHostSuccess,this,[=]()
    {
        QHostInfo::lookupHost(address, this, SLOT(lookUp(QHostInfo)));
        emit conSuccessSig(address,HostName);
    });
    connect(TcpManager::instance(),&TcpManager::connectToHostFailure,[=](){
        QHostInfo::lookupHost(address, this, SLOT(lookUp(QHostInfo)));
        emit conFailSig(address,HostName);
    });
}

NewConRect *NewConRect::instance()
{
    return Sington<NewConRect>::getInstance();
}
/**
 * @brief NewConRect::isIpAddr
 * @param ip
 * @return
 * 先把IP地址分为两部分一部分是123.123.123. 另一部分是123，\d+\.\d+\.\d+\.\d+ (\d表示0-9）
 * 又因Ip最大值为255，所以先使用分组，然后在组里边再进行选择，组里也有三部分，0-199,200-249,250-255，
 * 分别和上述的表达是对应，最后还要注意分组之后还要加上一个.，因为是元字符所以要转义故加上\.
 * 然后再把这部分整体看做是一个组，重复三次，再加上仅有数字的一组也就是不带\.的那一组即可完成IP地址的校验
 * 非捕获组(?:表达式)，从而不捕获数据，还能使用分组的功能
 */
bool NewConRect::isIpAddr(const QString &ip)
{
    QRegExp m_rxipaddr("(\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b)");
    if(m_rxipaddr.exactMatch(ip))
    {
        return true;
    }
    return false;

}
/**
 * @brief NewConRect::onBtnConnectClicked
 * @param str_add
 * @param str_port
 * 当连接按钮按下的时候的槽函数
 */
void NewConRect::onBtnConnectClicked(QString str_add, QString str_port)
{
    address = str_add;
    port = str_port.toInt();

    TcpManager* tcpManager = TcpManager::instance();
    if(isIpAddr(str_add))
    {
        tcpManager->connectToHost("test" , address, port);
    }
    else{
         qDebug() << "The ip address you entered is invalid";
    }
}
/**
 * @brief NewConRect::lookUp
 * @param host
 * 根据IP找到对应的主机名字
 */
void NewConRect::lookUp(const QHostInfo &host)
{
    if(host.error() != QHostInfo::NoError){

        qDebug() << "Lookup failed: " << host.errorString();
        return;
    }

    const auto addresses = host.addresses();
    for(const QHostAddress &address : addresses){
        HostName = host.hostName();
        qDebug() << "address:" << address.toString() << "  hostname:" << host.hostName();
    }
}
